function [G, G_hat] = gen_filter(N, B, std_div, omega)
%%
% 函数名：[G, G_hat] = gen_filter(N, B, std_div, omega)
% 功  能：生成满足一定条件的平坦窗
% 参  数：
%       N：采样信号的总点数
%       B：分筐数
%       std_div：用于生成高斯窗的标准差值
%       omega：用于划定平坦窗范围的值，约束时域序列的长度
% 返回值：
%       G：变换后的频域结果
%       G_hat：滤波器幅值补偿
%
% 注：无
%%

    % 矩形窗的通带长度
    boxcar_length = floor(2 * B); 

    % 生成矩形窗，该矩形窗的通带的中心频率在 N/2 处
    F_boxcar = zeros(N, 1);
    F_boxcar((N-boxcar_length)/2:(N+boxcar_length)/2) = 1;

    % 生成高斯窗，该高斯窗的中心频率在 N/2 上
    F_gauss_x = (0:N-1) - N/2;
    F_gauss = exp( - F_gauss_x.^2 / (2*std_div*std_div));

    % 频域上进行卷积，生成所需滤波器
    F_after_conv = conv(F_boxcar, F_gauss, 'same'); 

    % 归一化，包括幅值和中心频率
    F_after_conv = F_after_conv ./ max(F_after_conv); 
    F_after_conv = circshift(F_after_conv, N/2+1);

    % 利用 fft 反变换得到平坦窗的时域序列
    after_conv = fftshift(ifft(F_after_conv, N)); 

    % 截断，以获得需要的平坦窗的时域序列
    N_window = length(after_conv);
    G = real(after_conv(ceil((N_window - omega)/2):ceil((N_window + omega)/2)-1));

    % 利用 fft 得到平坦窗的频域序列
    G_hat = fftshift(fft(G, N)); 

    % 取平坦窗通带的中心部分，用于幅值估计
    N_window = length(G_hat);
    G_hat = G_hat(ceil((N_window - B)/2):ceil((N_window + B)/2)-1);

end